首先是 19. Remove Nth Node From End of List (medium)
https://leetcode.com/problems/remove-nth-node-from-end-of-list/
給一個linked list: head,再給一個n,必須從這linked list裡刪除倒數第n個的node點。
這題滿簡單的
想法:
可以複製一個temp跟ans的linkedlist,然後head先跑到第n個位置上
接著讓temp跟head一起跑,當head跑到終點時,該位置即為要刪除的點位,
把該點為略過temp.next = temp.next.next,就可以把ans回傳了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
ans = temp1 = head
while n:
head = head.next
n-=1
if head is None:
return ans.next
while head.next:
temp1 = temp1.next
head = head.next
temp1.next = temp1.next.next
return ans
接下來是 200. Number of Islands (medium)
https://leetcode.com/problems/number-of-islands/
會給一個mxn的matrix,檢查'1'的區塊共有多少個。
想法:
class Solution:
#檢查1的區域有哪幾塊
#會想到走迷宮的題目 -> DFS or BFS
#這題比想像中的簡單
#簡單來說就是紀錄已經跑過的地方,找到'1'的時候就檢查他的四周是否是'1',是的話改變他
#函式跑完後就會把整塊陸地變成其他東西,代表跑完了,for loop在跑到該區塊時就不會檢查第二次
def numIslands(self, grid: List[List[str]]) -> int:
maxL,maxW = len(grid),len(grid[0])
def dfs(grid,i,j):
if i<0 or j<0 or i >=maxL or j >= maxW or grid[i][j] != '1':#跑出grid 或 跑到不是'1'時就不用跑了
return
grid[i][j] = "-"#代表跑過了
#往上下左右去跑
dfs(grid,i+1,j)
dfs(grid,i-1,j)
dfs(grid,i,j+1)
dfs(grid,i,j-1)
ans = 0
for i in range(maxL):
for j in range(maxW):
if grid[i][j] == '1':
dfs(grid,i,j)
ans+=1 #跑完一次加1
return ans
接下來是 509. Fibonacci Number(easy)
https://leetcode.com/problems/fibonacci-number/
超級基本題,算出費伯納器數列的第n個位置的值
當我看到這題的時候第一個看得是n會多大,結果只有30,寫個最簡單的遞迴都OK
class Solution:
def fib(self, n: int) -> int:
n = 30
if n<=1:
return n
a,b = 0,1
while n -1:
a,b = b,a+b
n-=1
return b
def fib(self, n: int) -> int:#這邊是我上面的東西算出來後,列表來跑速度用的
L = [0,1,1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040]
return L[n]
以上就是今天的練習,感謝大家觀看